/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.com.proteu.facesbeans.view.agendadomedico;

import br.com.proteu.hibernate.beans.AgendamentoProteu;
import br.com.proteu.hibernate.beans.MedicosProteu;
import br.com.proteu.hibernate.beans.UnidadesProteu;
import br.com.proteu.hibernate.util.FireBirdHelperProteu;
import br.com.proteu.util.RegexUtils;
import com.icesoft.faces.component.ext.HtmlCommandLink;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import javax.faces.event.ActionEvent;



/**
 *
 * @author eros
 */
public class AgendaDoMedicoChildView extends AgendaDoMedicoView implements Serializable{


    private List<Dias> listDias;

    public List<Dias> getListDias() {
        return listDias;
    }

    public void setListDias(List<Dias> listDias) {
        this.listDias = listDias;
    }


    public String getSrcUrlInclude(){
        if(strDiarioSemanal != null && strDiarioSemanal.equalsIgnoreCase("D")){
            strUrlInclude = "agendadomedicodiariapop.jspx";
        }else if(strDiarioSemanal != null && strDiarioSemanal.equalsIgnoreCase("S")){
            strUrlInclude = "agendadomedicosemanalpop.jspx";
        }else{
            strUrlInclude = "agendadomedicodiariapop.jspx";
        }
        return strUrlInclude;
    }


    public void changeUtlDestination(javax.faces.event.ValueChangeEvent event){

        if(event.getNewValue().toString().equalsIgnoreCase("D")){
            strUrlInclude = "agendadomedicodiariapop.jspx";
            blDiario = true;
        }else if(event.getNewValue().toString().equalsIgnoreCase("S")){
            strUrlInclude = "agendadomedicosemanalpop.jspx";
            blDiario = false;
        }else{
            strUrlInclude = "agendadomedicodiariapop.jspx";
            blDiario = true;
        }


    }
    
    public void buildAgendamento(){
        if(listAgendamentoProteu != null){listAgendamentoProteu.clear();}
        if(listAgendamentoProteubyDay != null){listAgendamentoProteubyDay.clear();}
        if(listDias != null){listDias.clear();}
        
        if(strHrInicio != null && strHrFinal != null && strIntervalo != null  && medicos  != null && unidades  != null){
            List<String> list = RegexUtils.geradorDeHrs(strHrInicio, strHrFinal, strIntervalo);
            if(this.strDiarioSemanal.equalsIgnoreCase("D")){

                listAgendamentoProteu =  buildAgendamento(dtStart, getMedicos(), getUnidades(), list);
                
            }else if(this.strDiarioSemanal.equalsIgnoreCase("s")){
                buildDias();
            }
            

        }

    }

    private void buildDias(){

                if(dtStart.before(dtEnd)){
                    listDias = new ArrayList<Dias>(10);
                    Calendar calStart = new GregorianCalendar();
                    calStart.setTime(dtStart);
                    Calendar calEnd = new GregorianCalendar();
                    calEnd.setTime(dtEnd);
                    Dias dia;
                    List<String> listHr = RegexUtils.geradorDeHrs(strHrInicio, strHrFinal, strIntervalo);
                    Integer id = new Integer(1);
                    
                    do{

                        if(checkWeekDay(calStart)){
                                dia = new Dias();
                                dia.setDtConsulta(calStart.getTime());
                                dia.setDiaId(id.toString());
                                List<AgendamentoProteu> listA = buildAgendamento(calStart.getTime(), getMedicos(), getUnidades(), listHr);
                                dia.setListAgendamentoProteuby(listA);
                                listDias.add(dia);
                        }
                                calStart.add(Calendar.DAY_OF_YEAR, 1);
                                if(calStart.equals(calEnd) && checkWeekDay(calStart)){
                                    dia = new Dias();
                                    dia.setDtConsulta(calStart.getTime());
                                    id = id+1;
                                    dia.setDiaId(id.toString());
                                    List<AgendamentoProteu> listA2 = buildAgendamento(calStart.getTime(), getMedicos(), getUnidades(), listHr);
                                    dia.setListAgendamentoProteuby(listA2);
                                    listDias.add(dia);
                                }
                        id++;

                    }while(calStart.before(calEnd));
                }
        grabFirstListAgendamentoFromDias();
        
    }
    private boolean checkWeekDay(Calendar cal){

        boolean result = false;

        
        switch(cal.get(Calendar.DAY_OF_WEEK)){
                case 1:
                    result = blSun;
                break;
                case 2:
                    result = blMon;
                break;
                case 3:
                    result = blTue;
                break;
                case 4:
                    result = blWed;
                break;
                case 5:
                    result = blThu;
                break;
                case 6:
                    result = blFri;
                break;
                case 7:
                    result = blSat;
                break;
                default:
                result = false;
        }

        return result;
    }
    private void grabFirstListAgendamentoFromDias(){
        if(listDias != null && listDias.size()>0){
            listAgendamentoProteubyDay = listDias.get(0).listAgendamentoProteuby;
        }
    }

    private List<AgendamentoProteu> buildAgendamento(Date dtAgendamento,MedicosProteu medico,UnidadesProteu unidade,List<String> listHorarios){
                    List<AgendamentoProteu> list = new ArrayList<AgendamentoProteu>(30);
                        if(listHorarios != null && listHorarios.size()>0){

                            //listAgendamentoProteu = new ArrayList<AgendamentoProteu>(20);
                             for(String s : listHorarios){
                                AgendamentoProteu a = new AgendamentoProteu();
                                a.setAgdStHoraConsulta(s);
                                a.setAgdDtConsulta(dtAgendamento);
                                a.setAgdChPresenca("N");
                                a.setMedStCodigo(medico);
                                a.setEscStCodigo(medico.getMedStCodigo());
                                a.setAgdChFlag("A");
                                a.setUniInCod(unidade.getUniInCodigo());
                                list.add(a);
                            }

                        }

             return list;
    }

  public void changeUnidadeValue(javax.faces.event.ValueChangeEvent event){
        String codigoUnidade = event.getNewValue().toString();
        if(codigoUnidade != null){
            this.unidades = (UnidadesProteu) FireBirdHelperProteu.getObject(UnidadesProteu.class,new Integer(codigoUnidade) );
            
        }
   }
  public void changeMedicoValue(javax.faces.event.ValueChangeEvent event){
        String codigoMedico = event.getNewValue().toString();
        if(codigoMedico != null){
            this.medicos = (MedicosProteu) FireBirdHelperProteu.getObject(MedicosProteu.class, codigoMedico);
            if(medicos != null){
                //this.strEspecialidade = medicos.getEspecialidadesClinicaProteuObject().getEscStProcDescricao();
            }
        }
   }


  private Dias grabDiaFromList(String diaId){
        Dias d  = null;
        if(diaId != null){
            for(Dias dia : listDias){
                if(dia.getDiaId().equalsIgnoreCase(diaId)){
                    d =  dia;
                    break;
                }

            }
        }
        return d;
  }

  public void grabDiaFromList(ActionEvent event){
        String diaId = ((HtmlCommandLink) event.getComponent()).getLang();
        if(diaId != null){
            Dias dia = grabDiaFromList(diaId);
            if(dia != null){
                listAgendamentoProteubyDay = dia.getListAgendamentoProteuby();
            }
        }
  }






    


    public class Dias {

                    private String  diaId;
                    private Date dtConsulta;
                    private  List<AgendamentoProteu> listAgendamentoProteuby;

                    public String getDiaId() {
                        return diaId;
                    }

                    public void setDiaId(String diaId) {
                        this.diaId = diaId;
                    }

                    public Date getDtConsulta() {
                        return dtConsulta;
                    }


                    public void setDtConsulta(Date dtConsulta) {
                        this.dtConsulta = dtConsulta;
                    }

                    public List<AgendamentoProteu> getListAgendamentoProteuby() {
                        return listAgendamentoProteuby;
                    }

                    public void setListAgendamentoProteuby(List<AgendamentoProteu> listAgendamentoProteuby) {
                        this.listAgendamentoProteuby = listAgendamentoProteuby;
                    }

   }







    public void changeHrInicio(javax.faces.event.ValueChangeEvent event){
//        String hrInicio = event.getNewValue().toString();
//        //System.out.println(hrInicio);
//        List<Integer> list = RegexUtils.retornaHorasMinutos(hrInicio);
//        if(dtStart != null && list != null && list.size() == 2){
//            Calendar cal = Calendar.getInstance();
//            cal.setTime(dtStart);
//            Calendar cal2 =  new GregorianCalendar(
//                        cal.get(Calendar.YEAR)
//                      ,cal.get(Calendar.MONTH)
//                      ,cal.get(Calendar.DAY_OF_MONTH)
//                      ,11//,cal.get(Calendar.HOUR_OF_DAY)
//                      ,30//,cal.get(Calendar.MINUTE)
//                      ,cal.get(Calendar.SECOND));
//
//            dtStart2 = cal2.getTime();
//        }
   }
    public void changeHrFinal(javax.faces.event.ValueChangeEvent event){
//        String hrFinal = event.getNewValue().toString();
//        //System.out.println(hrFinal);
//        List<Integer> list = RegexUtils.retornaHorasMinutos(hrFinal);
//        if(dtEnd != null && list != null && list.size() == 2){
//            Calendar cal = Calendar.getInstance();
//            cal.setTime(dtFinal);
//            cal.add(Calendar.HOUR, list.get(0));
//            cal.add(Calendar.MINUTE, list.get(1));
//            dtFinal = cal.getTime();
//        }
   }

}

